package pam.restapi;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import pam.helpers.Static;
import javax.annotation.PostConstruct;
import java.util.List;

@RestController
public class PamController {

  @Autowired
  private ApplicationModel application;
  @Autowired
  MappingJackson2HttpMessageConverter converter;

  // liste de messages
  private List<String> messages;
  // mapper JSON
  private ObjectMapper mapper;

  @PostConstruct
  public void init() {
    // messages d'erreur de l'application
    messages = application.getMessages();
    // mapper JSON
    mapper=converter.getObjectMapper();
  }

    //Liste Employes
    @RequestMapping(value = "/employes", method = RequestMethod.GET)
    public EmployesResponse getEmployes() {
        // état de l'application
        if (messages != null) {
            EmployesResponse er = new EmployesResponse();
            er.setErreur(40);
            er.setMessages(messages);
            return er;
             }
         // liste des employes
         try {
             EmployesResponse er = new EmployesResponse();
             er.setEmployés(application.getEmployes());
             // sérialisation de la réponse
             SimpleBeanPropertyFilter employeFilter = SimpleBeanPropertyFilter.serializeAllExcept("indemnite");
             mapper.setFilters(new SimpleFilterProvider().addFilter("employeFilter", employeFilter));
             return er;
             } catch (Exception e) {
             EmployesResponse er = new EmployesResponse();
             er.setErreur(41);
             er.setMessages(Static.getErreursForException(e));
             return er;
             }
    }

    @RequestMapping(value = "/salaire/{SS}/{ht}/{jt}", method = RequestMethod.GET)//lie la foncton à l'url
    public FeuilleSalaireResponse getFeuilleSalaire(@PathVariable("SS") String SS, @PathVariable("ht") double ht,@PathVariable("jt") int jt ) {//recupère les variable à partir de l'url
        // état de l'application
        if (messages != null) {
            FeuilleSalaireResponse fs = new FeuilleSalaireResponse();
            fs.setErreur(42);
            fs.setMessages(messages);
            return fs;
        }
        // feuille de salaire
        try {
            FeuilleSalaireResponse fs = new FeuilleSalaireResponse();
            fs.setFeuilleSalaire(application.getFeuilleSalaire(SS, ht, jt));
            // sérialisation de la réponse
            SimpleBeanPropertyFilter employeFilter = SimpleBeanPropertyFilter.serializeAllExcept();
            mapper.setFilters(new SimpleFilterProvider().addFilter("employeFilter", employeFilter));
            return fs;
        } catch (Exception e) {
            FeuilleSalaireResponse fs = new FeuilleSalaireResponse();
            fs.setErreur(43);
            fs.setMessages(Static.getErreursForException(e));
            return fs;
        }
    }
}